package com.koron.common.core.business.common.service;

import com.koron.bean.base.Attachment;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @author qingfeng
 * @description: 附件接口
 * @date 2021/4/26 10:23
 */
public interface AttachmentService {

    /**
     * 删除之前业务附件， 适用于业务更新
     *
     * @param businessId 业务id
     * @param files      上传的附件
     * @return 上传成功后的附件, 成功返回附件实体, 失败抛出异常
     */
    List<Attachment> uploadAttachment(String businessId, MultipartFile... files);

    /**
     * 删除之前业务附件， 适用于业务更新
     *
     * @param user         当前用户
     * @param businessId   业务id
     * @param businessType 业务类型
     * @param files        上传的附件
     * @return 上传成功后的附件, 成功返回附件实体, 失败抛出异常
     */
    List<Attachment> uploadAttachmentWithType(String businessId, String businessType, MultipartFile... files);

    /**
     * 删除之前业务附件， 适用于业务更新
     *
     * @param user         当前用户
     * @param businessId   业务id
     * @param businessType 业务类型
     * @param files        上传的附件
     * @return 上传成功后的附件, 成功返回附件实体, 失败抛出异常
     */
    List<Attachment> uploadAttachmentWithTypeWithSubBusinessId(String businessId, String subBusinessId, String businessType, MultipartFile... files);

    /**
     * 上传附件
     *
     * @param businessId 业务id
     * @param file       上传的附件
     * @return 上传成功后的附件, 成功返回附件实体, 失败抛出异常
     */
    Attachment uploadSingleAttachment(String businessId, MultipartFile file);

    /**
     * 上传附件
     *
     * @param user         当前用户
     * @param businessId   业务id
     * @param businessType 业务类型
     * @param file         上传的附件
     * @return 上传成功后的附件, 成功返回附件实体, 失败抛出异常
     */
    Attachment uploadSingleAttachmentWithType(String businessId, String businessType, MultipartFile file);

    /**
     * 上传附件
     *
     * @param user          当前用户
     * @param businessId    业务id
     * @param subBusinessId 子业务id
     * @param businessType  业务类型
     * @param file          上传的附件
     * @return 上传成功后的附件, 成功返回附件实体, 失败抛出异常
     */
    Attachment uploadSingleAttachmentWithTypeWithSubBussinessId(String businessId, String subBusinessId, String businessType, MultipartFile file);

    /**
     * 根据业务id查询附件列表
     *
     * @param businessId 业务id
     * @return 附件列表
     */
    List<Attachment> getAttachmentListByBusinessId(String businessId);

    /**
     * 根据业务id查询附件列表
     *
     * @param businessId   业务id
     * @param businessType 业务类型
     * @return 附件列表
     */
    List<Attachment> getAttachmentListByBusinessIdWithType(String businessId, String businessType);

    /**
     * 根据业务id查询附件列表
     *
     * @param businessId    业务id
     * @param subBusinessId 子业务id
     * @param businessType  业务类型
     * @return 附件列表
     */
    List<Attachment> getAttachmentListByBusinessIdWithTypeWithSubBusinessId(String businessId, String subBusinessId, String businessType);

    /**
     * 根据业务ids查询附件列表
     *
     * @param businessIds  业务ids
     * @param businessType 业务类型
     * @return 附件列表
     */
    List<Attachment> getAttachmentListByBusinessIdsWithType(String[] businessIds, String businessType);


    /**
     * 根据附件id获取附件信息
     *
     * @param id 附件id
     * @return 附件
     */
    Attachment getById(String id);

    /**
     * 根据附件的url获取附件
     *
     * @param attachmentUrl 附件url
     * @return 附件实体
     */
    Attachment getByUrl(String attachmentUrl);

    /**
     * 根据业务id删除附件
     *
     * @param businessId 业务id
     * @return 影响的行数
     */
    int deleteAttachment(String businessId);

    /**
     * 根据业务ids删除附件
     *
     * @param businessIds 业务ids
     * @return 影响的行数
     */
    int deleteByBusinessIdsWithType(String[] businessIds, String businessType);

    /**
     * 根据业务id+业务类型删除附件
     *
     * @param businessId   业务id
     * @param businessType 业务类型
     * @return 影响的行数
     */
    int deleteAttachmentWithType(String businessId, String businessType);

    /**
     * 根据业务id+业务类型删除附件
     *
     * @param businessId    业务id
     * @param subBusinessId 子业务id
     * @param businessType  业务类型
     * @return 影响的行数
     */
    int deleteAttachmentWithTypeWithSubBusinessId(String businessId, String subBusinessId, String businessType);

    /**
     * 根据id删除附件
     *
     * @param ids 附件id
     * @return 返回删除的附件个数
     */
    int deleteAttachment(String[] ids);

    /**
     * 追加附件，不会删除原有附件
     *
     * @param files      附件
     * @param user       当前用户
     * @param businessId 业务id
     * @return 附件的个数
     */
    List<Attachment> appendAttachment(String businessId, String[] deleteFileIds, MultipartFile... files);

    /**
     * 追加附件，不会删除原有附件
     *
     * @param files         附件
     * @param user          当前用户
     * @param businessId    业务id
     * @param businessType  业务类型
     * @param deleteFileIds 删除ids
     * @return 附件的个数
     */
    List<Attachment> appendAttachmentWithType(String businessId, String businessType, String[] deleteFileIds, MultipartFile... files);

    /**
     * 追加附件，不会删除原有附件
     *
     * @param files         附件
     * @param user          当前用户
     * @param businessId    业务id
     * @param subBusinessId 子业务id
     * @param businessType  业务类型
     * @param deleteFileIds 删除ids
     * @return 附件的个数
     */
    List<Attachment> appendAttachmentWithTypeWithSubBusinessId(String businessId, String subBusinessId, String businessType, String[] deleteFileIds, MultipartFile... files);

    /**
     * 复制附件
     *
     * @param businessId     业务id
     * @param copyBusinessId 被复制的业务id
     * @return
     */
    int copyAttachment(String businessId, String copyBusinessId);

    /**
     * 复制附件
     *
     * @param businessId     业务id
     * @param copyBusinessId 被复制的业务id
     * @return
     */
    int copyAttachmentWithType(String businessId, String businessType, String copyBusinessId);

    /**
     * 复制附件
     *
     * @param user           当前用户
     * @param businessId     业务id
     * @param copyBusinessId 被复制的业务id
     * @return
     */
    int copyAttachmentWithType(String businessId, String businessType, String copyBusinessId, String copyBusinessType);


    /**
     * 复制附件
     *
     * @param businessId     业务id
     * @param copyBusinessId 被复制的业务id
     * @return
     */
    int copyAttachmentWithTypeWithSubBusinessId(String businessId, String subBusinessId, String businessType, String copyBusinessId, String copySubBusinessId, String copyBusinessType);

    int copyAttachmentWithTypeWithSubBusinessIdWithFileIds(String businessId, List<String> fileIds, String subBusinessId, String businessType, String copyBusinessId, String copySubBusinessId, String copyBusinessType);

    /**
     * 下载fdfs文件
     *
     * @param fileUrl 文件路径
     * @return 文件
     */
    byte[] download(String fileUrl);

    int updateAttachment(Attachment attachment);

    /**
     * 根据附件id获取附件信息
     *
     * @param ids 附件ids
     * @return 附件
     */
    List<Attachment> getByIds(String ids);

}
